package Main;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;


public class Gen {
    
        private static boolean pertenece(Set<Eje> conjEje, Eje e){
            /*
             * Chequea si un eje pertenece a un conj de ejes.
             * solo alcanza con chequear esa condicion del if, 
             * ya que los ejes solo se arman desde iV1 hacia iV2. 
             */
                for(Eje  ejeC : conjEje){
                    if((ejeC.fst == e.fst) && (ejeC.scd == e.scd))
                        return true;
                }
            return false;
        }
    
	public static void Gen(int cantv1, int cantv2, int cantiv1, int cantiv2, int porcentaje) {
		
		// Valores a Modificar
		Integer cantV1 = new Integer(cantv1);
		Integer cantV2 = new Integer(cantv2);
		Integer cantiV1 = new Integer(cantiv1);
		Integer cantiV2 = new Integer(cantiv2);
		int porcentajeEjes = porcentaje;

		// fin Valores a Modificar
		
		
		ArrayList<Integer> V1= new ArrayList<Integer>();
		ArrayList<Integer> V2= new ArrayList<Integer>(); 
		ArrayList<Integer> iV1= new ArrayList<Integer>(); 
		ArrayList<Integer> iV2= new ArrayList<Integer>(); 
		
		for(int i = 1; i<= cantV1.intValue();i++){
			V1.add(new Integer(i));
		}

		for(int i = 1; i<= cantV2.intValue();i++){
			V2.add(new Integer(i+cantV1.intValue()));
		}
		for(int i = 1; i<= cantiV1.intValue();i++){
			iV1.add(new Integer(i+cantV1.intValue()+cantV2.intValue()));
		}
		for(int i = 1; i<= cantiV2.intValue();i++){
			iV2.add(new Integer(i+cantV1.intValue()+cantV2.intValue()+cantiV1.intValue()));
		}
		
		File fileOut = new File("Tp3.in");
		FileWriter fwOut = null;
		
		
		try {
			fwOut = new FileWriter(fileOut);
			BufferedWriter out = new BufferedWriter(fwOut);
		
			// cantV1
			out.write(cantV1.toString());
			out.newLine();
			int iRnd;
			
			ArrayList<Integer> V1Aux= new ArrayList<Integer>();
			for(Integer i:V1){
				V1Aux.add(new Integer(i));
			}
			
			ArrayList<Integer> V2Aux= new ArrayList<Integer>();
			for(Integer i:V2){
				V2Aux.add(new Integer(i));
			}
			ArrayList<Integer> iV1Aux= new ArrayList<Integer>();
			for(Integer i:iV1){
				iV1Aux.add(new Integer(i));
			}
			ArrayList<Integer> iV2Aux= new ArrayList<Integer>();
			for(Integer i:iV2){
				iV2Aux.add(new Integer(i));
			}
			// escribo v1
			while(V1Aux.size()>0){
				iRnd = (int)((Math.random()*100)%V1Aux.size());
				out.write(V1Aux.get(iRnd).toString());
				out.newLine();
				V1Aux.remove(iRnd);
			}
			V1Aux.addAll(V1);
			// cant V2
			out.write(cantV2.toString());
			out.newLine();
			//escribo v2
			while(V2Aux.size()>0){
				iRnd = (int)((Math.random()*100)%V2Aux.size());
				out.write(V2Aux.get(iRnd).toString());
				out.newLine();
				V2Aux.remove(iRnd);
			}
			out.flush();
		    V2Aux.addAll(V2);
			int porcentajeParcial = 0;
		    
		    V1Aux.addAll(iV1);
		   
		    V2Aux.addAll(iV2);
		    
		    //armo los ejes
		    Set<Eje> conjEjes = new HashSet<Eje>();
		    while(porcentajeEjes > porcentajeParcial){
		    	Eje a = new Eje();
		        a.fst = V1Aux.get((int) (Math.random()*100)%V1Aux.size());
		        a.scd = V2Aux.get((int) (Math.random()*100)%V2Aux.size());
                        if(!pertenece(conjEjes,a)){
                            conjEjes.add(a);
        		    porcentajeParcial = (int) conjEjes.size()*100/(V1Aux.size()*V2Aux.size());
                        }

                    }
		    
		    // separo los ejes de V1 a V2
		    Set<Eje> conjEjesV = new HashSet<Eje>();
		    Set<Eje> conjEjesiV = new HashSet<Eje>();
		    for(Eje e:conjEjes){
		    	if(V1.contains(new Integer(e.fst)) && V2.contains(new Integer(e.scd)))
		    			conjEjesV.add(e);
		    	else
		    			conjEjesiV.add(e);
		    }
		    
		    //cantidad ejes de V
		    out.write(new Integer(conjEjesV.size()).toString());
		    out.newLine();
		    out.flush();
		    //escribo ejes de V
		    for(Eje a : conjEjesV){
		    	out.write(new Integer(a.fst).toString());
		    	out.write(" ");
		    	out.write(new Integer(a.scd).toString());
		    	out.newLine();
		    	out.flush();
		    }
			
		    //cantidad iV1
		    out.write(cantiV1.toString());
		    out.newLine();
		    //escribo iV1
		    while(iV1Aux.size()>0){
				iRnd = (int)((Math.random()*100)%iV1Aux.size());
				out.write(iV1Aux.get(iRnd).toString());
				out.newLine();
				iV1Aux.remove(iRnd);
			}
		    //cantidad iV2
		    out.write(cantiV2.toString());
		    out.newLine();
		    //escribo iV2
			while(iV2Aux.size()>0){
				iRnd = (int)((Math.random()*100)%iV2Aux.size());
				out.write(iV2Aux.get(iRnd).toString());
				out.newLine();
				iV2Aux.remove(iRnd);
			}
			out.flush();

		    //cantidad iejes
		    out.write(new Integer(conjEjesiV.size()).toString());
		    out.newLine();
		    out.flush();
		    //escribo iejes
		    for(Eje a : conjEjesiV){
		    	out.write(new Integer(a.fst).toString());
		    	out.write(" ");
		    	out.write(new Integer(a.scd).toString());
		    	out.newLine();
		    	out.flush();
		    }
		    out.write(new Integer(-1).toString());
		    out.flush();

		} catch (IOException e) {
			System.out.println("NO SE PUDO LEER EL ARCHIVO");
			e.printStackTrace();
		} finally {
			try {
				if ( fwOut != null )
					fwOut.close();
			} catch (IOException e) {
				System.out.println("Error al cerrar el archivo grafo");
			}

		}
		
	}
        
        public static void Gen2(int cantv1, int cantv2, int cantiv1, int cantiv2, int porcentaje, int CantBigrafos) 
        {
		try {	
            File fileOut = new File("Tp3.in");
		FileWriter fwOut = null;
                fwOut = new FileWriter(fileOut);
			BufferedWriter out = new BufferedWriter(fwOut);
            for(int p = 0; p< CantBigrafos; p++)
            {
		// Valores a Modificar
		Integer cantV1 = new Integer(cantv1);
		Integer cantV2 = new Integer(cantv2);
		Integer cantiV1 = new Integer(cantiv1);
		Integer cantiV2 = new Integer(cantiv2);
                int porcentajeEjes = porcentaje;
                // Esto está comentado porque solo quiero variar la cantidad de ejes, no la cantidad de vertices
//                cantv1 = (int)((double)cantv1*1.5);
//                cantiv2 = (int)((double)cantiv2*1.5);
//                cantv2 = (int)((double)cantv2*1.5);
//                cantiv1 = (int)((double)cantiv1*1.5);
		// fin Valores a Modificar
		
		
		ArrayList<Integer> V1= new ArrayList<Integer>();
		ArrayList<Integer> V2= new ArrayList<Integer>(); 
		ArrayList<Integer> iV1= new ArrayList<Integer>(); 
		ArrayList<Integer> iV2= new ArrayList<Integer>(); 
		
		for(int i = 1; i<= cantV1.intValue();i++){
			V1.add(new Integer(i));
		}

		for(int i = 1; i<= cantV2.intValue();i++){
			V2.add(new Integer(i+cantV1.intValue()));
		}
		for(int i = 1; i<= cantiV1.intValue();i++){
			iV1.add(new Integer(i+cantV1.intValue()+cantV2.intValue()));
		}
		for(int i = 1; i<= cantiV2.intValue();i++){
			iV2.add(new Integer(i+cantV1.intValue()+cantV2.intValue()+cantiV1.intValue()));
		}
		
		
		
		
	
			
		
			// cantV1
			out.write(cantV1.toString());
			out.newLine();
			int iRnd;
			
			ArrayList<Integer> V1Aux= new ArrayList<Integer>();
			for(Integer i:V1){
				V1Aux.add(new Integer(i));
			}
			
			ArrayList<Integer> V2Aux= new ArrayList<Integer>();
			for(Integer i:V2){
				V2Aux.add(new Integer(i));
			}
			ArrayList<Integer> iV1Aux= new ArrayList<Integer>();
			for(Integer i:iV1){
				iV1Aux.add(new Integer(i));
			}
			ArrayList<Integer> iV2Aux= new ArrayList<Integer>();
			for(Integer i:iV2){
				iV2Aux.add(new Integer(i));
			}
			// escribo v1
			while(V1Aux.size()>0){
				iRnd = (int)((Math.random()*100)%V1Aux.size());
				out.write(V1Aux.get(iRnd).toString());
				out.newLine();
				V1Aux.remove(iRnd);
			}
			V1Aux.addAll(V1);
			// cant V2
			out.write(cantV2.toString());
			out.newLine();
			//escribo v2
			while(V2Aux.size()>0){
				iRnd = (int)((Math.random()*100)%V2Aux.size());
				out.write(V2Aux.get(iRnd).toString());
				out.newLine();
				V2Aux.remove(iRnd);
			}
			out.flush();
		    V2Aux.addAll(V2);
			int porcentajeParcial = 0;
		    
		    
		    
		    V1Aux.addAll(iV1);
		   
		    V2Aux.addAll(iV2);
		    
		    //armo los ejes
		    Set<Eje> conjEjes = new HashSet<Eje>();
		    while(porcentajeEjes > porcentajeParcial){
		    	Eje a = new Eje();
		        a.fst = V1Aux.get((int) (Math.random()*100+Math.random()*10000)%V1Aux.size());
		        a.scd = V2Aux.get((int) (Math.random()*100+Math.random()*50078)%V2Aux.size());
		        if(!pertenece(conjEjes,a)){
                                conjEjes.add(a);
        		        porcentajeParcial = (int) conjEjes.size()*100/(V1Aux.size()*V2Aux.size());
                        }
                    }
		    
		    // separo los ejes de V1 a V2
		    Set<Eje> conjEjesV = new HashSet<Eje>();
		    Set<Eje> conjEjesiV = new HashSet<Eje>();
		    for(Eje e:conjEjes){
		    	if(V1.contains(new Integer(e.fst)) && V2.contains(new Integer(e.scd)))
		    			conjEjesV.add(e);
		    	else
		    			conjEjesiV.add(e);
		    }
                    
		    
		    //cantidad ejes de V
		    out.write(new Integer(conjEjesV.size()).toString());
		    out.newLine();
		    out.flush();
		    //escribo ejes de V
		    for(Eje a : conjEjesV){
		    	out.write(new Integer(a.fst).toString());
		    	out.write(" ");
		    	out.write(new Integer(a.scd).toString());
		    	out.newLine();
		    	out.flush();
		    }
			
		    //cantidad iV1
		    out.write(cantiV1.toString());
		    out.newLine();
		    //escribo iV1
		    while(iV1Aux.size()>0){
				iRnd = (int)((Math.random()*100)%iV1Aux.size());
				out.write(iV1Aux.get(iRnd).toString());
				out.newLine();
				iV1Aux.remove(iRnd);
			}
		    //cantidad iV2
		    out.write(cantiV2.toString());
		    out.newLine();
		    //escribo iV2
			while(iV2Aux.size()>0){
				iRnd = (int)((Math.random()*100)%iV2Aux.size());
				out.write(iV2Aux.get(iRnd).toString());
				out.newLine();
				iV2Aux.remove(iRnd);
			}
			out.flush();

		    //cantidad iejes
		    out.write(new Integer(conjEjesiV.size()).toString());
		    out.newLine();
		    out.flush();
		    //escribo iejes
		    for(Eje a : conjEjesiV){
		    	out.write(new Integer(a.fst).toString());
		    	out.write(" ");
		    	out.write(new Integer(a.scd).toString());
		    	out.newLine();
		    	out.flush();
		    }
                }
		    out.write(new Integer(-1).toString());
		    out.flush();

		} catch (IOException e) {
			System.out.println("NO SE PUDO LEER EL ARCHIVO");
			e.printStackTrace();
		} 
		
	}

}

